package org.qydjk.common.dao;

import org.qydjk.common.vo.HibernatePage;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;


public  interface IBaseDao {
    /**
     * 保存
     * @return id
     */
    public <T> Serializable save(T t) throws Exception;

    /**
     * 修改
     * !!!!注意这个方法要先查询再调用，hibernate会全字段更新
     */
    public <T> void update(T t) throws Exception;

    /**
     * 删除
     */
    public <T> void delete(T t) throws Exception;

    /**
     * 批量删除
     * @param ts
     * @throws Exception
     */
    public <T> void deleteAll(Collection<T> ts) throws Exception;

    /**
     * 修改或保存
     */
    public <T> void saveOrUpdate(T t) throws Exception;

    /**
     * 当调用load()方法的时候会返回一个目标对象的代理对象，在这个代理对象中只存储了目标对象的ID值，只有当调用除ID值以外的属性值的时候才会发出SQL查询的
     * 带缓存
     * @param t
     * @param id
     * @return
     * @throws Exception
     */
    public <T> T load(Class<T> t, Serializable id) throws Exception;

    /**
     * 当get()方法被调用的时候就会立即发出SQL语句进行查询
     * 带缓存
     * @param t
     * @param id
     * @return
     * @throws Exception
     */
    public <T> T get(Class<T> t, Serializable id) throws Exception;


    /**
     * HQL语句查询，参数自定义
     * @param hql
     * @param values
     * @return
     */
    public <T> List<T> findByHql(String hql, Object... values) throws Exception;

    /**
     * HQL语句查询，分页，参数自定义
     * @param hql
     * @param pager
     * @param values
     * @param <T>
     * @return
     * @throws Exception
     */
    public <T> List<T> findByHql(String hql, HibernatePage pager, Object... values) throws Exception;


    /**
     * 根据模型中已有的字段，查找相似的
     * @param t
     * @return
     */
    public <T> List<T> findByExample(T t) throws Exception;

    /**
     * SQL语句查询，参数自定义
     * !!!!!实体必须和数据库表对应
     * @param sql
     * @param cls
     * @param values
     * @param <T>
     * @return
     * @throws Exception
     */
    public <T> List<T> findBySQL(String sql, Class<?> cls, Object... values) throws Exception;

    /**
     * SQL语句查询，分页，参数自定义
     * !!!!!实体必须和数据库表对应
     * @param sql
     * @param cls
     * @param pager
     * @param values
     * @param <T>
     * @return
     * @throws Exception
     */
    public <T> List<T> findBySQL(String sql, Class<?> cls, HibernatePage pager, Object... values) throws Exception;

    /**
     * SQL语句查询，参数自定义，返回Map
     * @param sql
     * @param values
     * @return
     * @throws Exception
     */
    public List<Map<String,Object>> findMapBySQL(String sql, Object... values) throws Exception;

    /**
     * SQL语句查询，分页，参数自定义，返回Map
     * @param sql
     * @param pager
     * @param values
     * @return
     * @throws Exception
     */
    public List<Map<String,Object>> findMapBySQL(String sql, HibernatePage pager, Object... values) throws Exception;

    /**
     * 执行SQL语句，返回影响的行数
     * @param sql
     * @return
     * @throws Exception
     */
    public int excuteSQL(String sql) throws Exception;

    /**
     * 执行HQL语句，返回影响的行数
     * @param hql
     * @return
     * @throws Exception
     */
    public int excuteHQL(String hql) throws Exception;

    /**
     * HQL获取记录的总数
     * @param hql
     * @param values
     * @return
     * @throws Exception
     */
    public int getRecordCountHQL(String hql, Object... values) throws Exception;

    /**
     * SQL获取记录的总数
     * @param sql
     * @param values
     * @return
     * @throws Exception
     */
    public int getRecordCountSQL(String sql, Object... values) throws Exception;

    /**
     * HQL获取单结果
     * @param hql
     * @param values
     * @return
     * @throws Exception
     */
    public <T> T getUniqueResultHQL(String hql, Object... values) throws Exception;

    /**
     * SQL获取单结果S
     * @param sql
     * @param values
     * @return
     * @throws Exception
     */
    public <T> T getUniqueResultSQL(String sql, Object... values) throws Exception;



    /**
     * SQL语句查询，参数自定义，List<List<Object>>
     * @param sql
     * @param values
     * @return
     * @throws Exception
     */
    public List<List<Object>> findSingleColumnListBySQL(String sql, Object... values) throws Exception;

    /**
     * SQL语句查询，分页，参数自定义，List<List<Object>>
     * @param sql
     * @param pager
     * @param values
     * @return
     * @throws Exception
     */
    public List<List<Object>> findSingleColumnListBySQL(String sql, HibernatePage pager, Object... values) throws Exception;

    /**
     * SQL语句查询，参数自定义，返回首个元素
     * !!!!!实体必须和数据库表对应
     * @param sql
     * @param cls
     * @param values
     * @param <T>
     * @return
     * @throws Exception
     */
    public <T> T findSingleBySQL(String sql, Class<?> cls, Object... values) throws Exception;

    /**
     * HQL语句查询，参数自定义，返回首个元素
     * @param hql
     * @param values
     * @return
     */
    public <T> T findSingleByHql(String hql, Object... values) throws Exception;

    /**
     * SQL语句查询，参数自定义，返回任意对象
     * @param sql
     * @param cls
     * @param values
     * @param <T>
     * @return
     * @throws Exception
     */
    public <T> List<T> findBeanBySQL(String sql, Class<?> cls, Object... values) throws Exception;

    /**
     * SQL语句查询，参数自定义，返回首个对象
     * @param sql
     * @param cls
     * @param values
     * @param <T>
     * @return
     * @throws Exception
     */
    public <T> T findSingleBeanBySQL(String sql, Class<?> cls, Object... values) throws Exception;

    /**
     * SQL语句查询，分页，参数自定义，返回任意对象
     * @param sql
     * @param cls
     * @param pager
     * @param values
     * @param <T>
     * @return
     * @throws Exception
     */
    public <T> List<T> findBeanBySQL(String sql, Class<?> cls, HibernatePage pager, Object... values) throws Exception;
}
